package com.zw.a.basic.a14.demo05_tcp_exercise;

//案例: TCP协议入门之 客户端给服务器端发送一句话, 服务器端给出回执信息.

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//自定义的TCP协议的服务器端
/*
    涉及到的类:
        Socket类
            构造方法:
                public Socket(InetAddress inet, int port);
                public Socket(String id, int port);             服务器ip, 端口号.
            成员方法:
                public InputStream  getInputStream();    获取输入流, 可以读取服务器端写过来的内容.
                public OutputStream getOutputStream();   获取输出流, 可以往服务器端写数据.
                public void close();                     关闭socket对象.
        ServerSocket:   服务器端的Socket类
            构造方法:
                public ServerSocket(int port);          服务器端的Socket对象, 负责监听客户端连接 和 分配资源的.
             成员方法:
                public Socket accept();                 监听客户端连接, 如果有客户端申请建立连接, 服务器端在审核数据
                                                        数据成功后, 会创建一个Socket对象, 负责和此客户端Socket的通信.
 */
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建服务器端的Socket对象.
        ServerSocket server = new ServerSocket(10010);
        //2. 监听客户端连接.
        Socket accept = server.accept();

        //3. 获取输入流, 可以读取客户端写过来的数据.
        InputStream is = accept.getInputStream();
        //4. 读取客户端写过来的数据, 并打印.
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String s = new String(bys, 0, len);
        System.out.println("服务器端接收到数据: " + s);

        //5. 给客户端一个回执信息
        //5.1. 获取输出流, 可以往客户端写数据.
        OutputStream os = accept.getOutputStream();
        //5.2. 给客户端写一句话.
        os.write("数据接收到了!".getBytes());

        //6. 关闭Socket对象.
        accept.close();
    }
}
